package TP4;

import java.util.Random;

import TP4.TDA.AVLTDA;
import TP4.implementation.AVL;


public class AVLTests {
	
	public static void main(String [] args) {
		runTests();
	}
	
	private static void runTests() {
		testEliminar();
	}
	
	private static void testEliminar() {
		System.out.println("\n Inicio test eliminar:");
		
//		deleteTest(AVLSamples.getABBSample1(), 5);
//		deleteTest(AVLSamples.getABBSample2(), 3);
//		deleteTest(AVLSamples.getABBSample3(), 15);
//		deleteTest(AVLSamples.getABBSample4(), 48);
//		deleteTest(AVLSamples.getABBSample5(), 45);
		
		randomsTest();
		
		System.out.println("Fin test eliminar.");
	}
	
	private static void deleteTest(AVL avl, int x) {
		System.out.println("\nSe va a eliminar " + x + ":");
		avl.eliminar(x);
		System.out.println("\t Sigue siendo AVL? " + (esAVL(avl) ? "Si" : "No"));
	}
	
	private static void randomsTest() {
		AVLTDA avl = new AVL();
		avl.inicializar();
		Random rnd = new Random();		
		int i = 0;
		while(i++ < 1000000) {
			int x = rnd.nextInt(1000000);
			
			if(i % 2 == 0) {
				System.out.println("- Se va a agregar " + x + ".");
				avl.agregar(x);
			} else {
				System.out.println("- Se va a eliminar " + x + ".");
				avl.eliminar(x);
			}
			boolean stillAVL = esAVL(avl);
			System.out.println("\t Sigue siendo AVL? " + (stillAVL ? "Si" : "No"));
			if(!stillAVL) {
				break;
			}
		}
	}
	
	private static int altura(AVLTDA avl) {
		if(avl.vacio()) {
			return -1;
		} else  if(avl.hijoIzq().vacio() && avl.hijoDer().vacio()) {
			return 0;
		} else {
			return (1 + Math.max(altura(avl.hijoIzq()), altura(avl.hijoDer())));
		}		
	}
	
	private static boolean esAVL(AVLTDA avl) {
		if(avl.vacio()) {
			return true;
		} else {
			if(Math.abs(altura(avl.hijoIzq()) - altura(avl.hijoDer())) > 1) {
				return false;
			} else {
				return (esAVL(avl.hijoIzq()) && esAVL(avl.hijoDer()));
			}
		}
	}
}
